package com.air.controller.passenger;


import com.air.dto.BaggageDTO;
import com.air.dto.BaggagePageQueryDTO;
import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.BaggageService;
import com.air.vo.BaggageVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 行李相关控制器，负责处理乘客的行李相关请求。
 * 通过@RestController和@RequestMapping注解，指定了控制器的名称和处理请求的URL路径。
 * 使用@Slf4j注解，引入日志工具，方便进行日志记录。
 * @Api注解用于Javadoc，标明该类是一个API，属于"行李相关接口"分类。
 */
@RestController("passengerBaggageController") // 指定控制器的名称防止和航司的BaggageController冲突
@RequestMapping("/passenger/baggage")
@Slf4j
@Api(tags = "行李相关接口")
public class BaggageController {

    @Autowired
    private BaggageService baggageService; // 自动注入BaggageService

    /**
     * 添加行李订单。
     *
     * 此方法接收一个BaggageDTO对象作为请求体，其中包含了行李的相关信息。
     * 方法的主要作用是将这个行李订单信息保存到系统中。
     *
     * @param baggageDTO 行李订单的数据传输对象，包含了旅客的行李信息。
     * @return 返回一个Result对象，表示操作的结果。如果操作成功，Result对象将包含成功的标志。
     */
    @PutMapping
    @ApiOperation("添加行李订单")
    public Result save(@RequestBody BaggageDTO baggageDTO) {
        // 调用baggageService的saveByPassenger方法保存行李订单信息。
        baggageService.saveByPassenger(baggageDTO);
        // 返回一个表示操作成功的Result对象。
        return Result.success();
    }


    /**
     * 分页查询行李信息的接口。

     * 该接口通过接收BaggagePageQueryDTO对象作为参数，实现机票信息的分页查询。
     * 返回查询结果的分页信息。
     *
     * @param baggagePageQueryDTO 分页查询条件，包含页码、每页数量等信息以及查询过滤条件。
     * @return Result<PageResult> 包含查询结果的分页信息，以及操作的成功与否状态。
     */
    @GetMapping("/page")
    @ApiOperation("分页查询行李")
    public Result<PageResult> PageQuery(BaggagePageQueryDTO baggagePageQueryDTO) {
        // 调用baggageService的pageQuery方法进行分页查询
        PageResult pageResult = baggageService.pageQuery(baggagePageQueryDTO);
        // 将查询结果封装到Result对象中返回，表示操作成功
        return Result.success(pageResult);
    }

    /**
     * 根据旅客ID查询其行李订单。

     * 本接口使用GET方法，通过路径参数传递旅客ID，返回该旅客的所有行李订单信息。
     * 使用@ApiOperation注解对接口功能进行描述，方便API文档的生成。
     *
     * @param id 旅客的唯一标识ID，作为路径参数传递。
     * @return 返回一个Result对象，其中包含查询到的行李订单列表。如果查询成功，Result的code字段为200，
     * data字段为查询结果列表；如果查询失败，Result的code字段为非200，message字段描述失败原因。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据旅客id查询行李订单")
    public Result<List<BaggageVO>> getById(@PathVariable Long id) {
        // 调用baggageService根据旅客ID查询行李订单
        List<BaggageVO> baggageVO = baggageService.getByPassengerId(id);
        // 将查询结果封装在Result对象中返回
        return Result.success(baggageVO);
    }


    /**
     * 处理行李退款请求。
     *
     * 该接口通过PUT方法接收一个行李ID列表，用于标识需要退款的行李。
     * 调用baggageService的refund方法来处理这些行李的退款操作。
     * 简化，退行李实质就是删除行李。
     * 接口返回一个表示操作成功的结果对象。
     *
     * @param ids 需要退款的行李ID列表，由路径变量提供。
     * @return 表示操作成功的结果对象。
     */
    @PutMapping("/refund/{ids}")
    @ApiOperation("退行李")
    public Result refund(@PathVariable List<Long> ids) {
        // 调用行李服务的退款方法，处理指定的行李项退款。
        baggageService.refund(ids);
        // 返回一个表示操作成功的结果对象。
        return Result.success();

    }

}
